﻿// CSHOWDlg.cpp: 实现文件
//

#include "pch.h"
#include "截屏软件_mfc.h"
#include "afxdialogex.h"
#include "CSHOWDlg.h"


// CSHOWDlg 对话框

IMPLEMENT_DYNAMIC(CSHOWDlg, CDialogEx)

CSHOWDlg::CSHOWDlg(CWnd* pParent /*=nullptr*/)
	: CDialogEx(IDD_JIEQU_DLG, pParent)
{
	m_nScreenWidth = GetSystemMetrics(SM_CXSCREEN);		//带任务栏的
	m_nScreenHeight = GetSystemMetrics(SM_CYSCREEN);	//带任务栏的

	//获取桌面dc
	CDC* pDeskDc = GetDesktopWindow()->GetDC();

	//创建兼容位图：
	CBitmap bmp;
	bmp.CreateCompatibleBitmap(pDeskDc,
		m_nScreenWidth, m_nScreenHeight);

	//创建内存dc
	m_memDc.CreateCompatibleDC(pDeskDc);

	//画：
	m_memDc.SelectObject(&bmp);
	m_memDc.BitBlt(0, 0, m_nScreenWidth, m_nScreenHeight,
		pDeskDc, 0, 0, SRCCOPY);


}

CSHOWDlg::~CSHOWDlg()
{
}

void CSHOWDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
}


BEGIN_MESSAGE_MAP(CSHOWDlg, CDialogEx)
	ON_WM_PAINT()
	//ON_WM_NCHITTEST()
	ON_WM_MOUSEMOVE()
	ON_WM_LBUTTONDOWN()
	ON_WM_LBUTTONUP()
	ON_WM_LBUTTONDBLCLK()
	ON_WM_RBUTTONDOWN()
END_MESSAGE_MAP()


// CSHOWDlg 消息处理程序


void CSHOWDlg::OnPaint()
{
	CPaintDC dc(this); // device context for painting
	// TODO: 在此处添加消息处理程序代码
	// 不为绘图消息调用 CDialogEx::OnPaint()


	//画桌面：
	dc.BitBlt(0, 0, m_nScreenWidth, m_nScreenHeight,
		&m_memDc, 0, 0, SRCCOPY);


	//画橡皮筋：
	m_tracker.Draw(&dc);






}









BOOL CSHOWDlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();

	// TODO:  在此添加额外的初始化


	//调整当前窗口的大小：铺满整个桌面 并且置顶
	SetWindowPos(&wndNoTopMost,//&wndNoTopMost,//&wndTopMost,
		0, 0, m_nScreenWidth, m_nScreenHeight,
		SWP_SHOWWINDOW);

	//初始化橡皮筋对象：	具体可以查看在线的帮助文档
	m_tracker.m_nHandleSize = 5;		//调整大小图柄的大小
	m_tracker.m_nStyle = CRectTracker::solidLine | CRectTracker::resizeOutside;		//实线和阴影风格
	m_tracker.m_rect.SetRect(0, 0, 0, 0);		//设置初始位置



	return TRUE;  // return TRUE unless you set the focus to a control
	// 异常: OCX 属性页应返回 FALSE
}


void CSHOWDlg::OnMouseMove(UINT nFlags, CPoint point)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值




	CDialogEx::OnMouseMove(nFlags, point);
}


//鼠标按下：
void CSHOWDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值

	//判断鼠标左键有没有点中橡皮筋的区域：
	if (CRectTracker::hitNothing == m_tracker.HitTest(point))
	{
		//没点中：

		//新建一个：
		m_tracker.TrackRubberBand(this, point, true);
		

	}
	else
	{
		//点中了：

		//拖着走：
		m_tracker.Track(this, point, true);

	}


	//刷新：
	Invalidate(false);

	CDialogEx::OnLButtonDown(nFlags, point);
}


void CSHOWDlg::OnLButtonUp(UINT nFlags, CPoint point)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值

	CDialogEx::OnLButtonUp(nFlags, point);
}


//双击保存：
void CSHOWDlg::OnLButtonDblClk(UINT nFlags, CPoint point)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值

	if (m_tracker.m_rect.PtInRect(point))
	{
		//橡皮筋在矩形内被双击：
		//截图：
		CBitmap bmp;
		bmp.CreateCompatibleBitmap(&m_memDc,
			m_tracker.m_rect.Width(), m_tracker.m_rect.Height());

		CDC tempDc;
		tempDc.CreateCompatibleDC(&m_memDc);
		tempDc.SelectObject(&bmp);

		tempDc.BitBlt(0, 0,
			m_tracker.m_rect.Width(), m_tracker.m_rect.Height(),	//所要截取的长和宽
			&m_memDc,
			m_tracker.m_rect.left, m_tracker.m_rect.top,//截图起始点
			SRCCOPY);


		//把bmp存到文件里去：
														//tm的注意 ：在定义文件夹路径时，不能添加":"冒号，不然会显示文件夹路径不正确

		srand((UINT)time(NULL));
		CTime time = CTime::GetCurrentTime();

		CString strFilename;
		//strFilename.Format(L"D:\\testfile\\%s_%d.bmp",
		//	time.Format(L"dk_%Y%m%d-%H:%M:%S"),
		//	rand() % 900 + 100			//100 - 999 之间
		//);

		int cnt =  rand() % 900 + 100;
		/*MessageBox( time.Format(L"dk_%Y%m%d-%H:%M:%S"));*/


		strFilename.Format(L"D:\\vs-code\\windows_mfc\\截屏软件_mfc\\save_bmp\\%s_%d.bmp", time.Format(L"dk_%Y.%m.%d_%H'%M'%S"),cnt);
		//MessageBox(strFilename);
		

		//检测文件路径或文件名不正确或没有写入权限：
		CFile file;
		if (!file.Open(strFilename, CFile::modeCreate | CFile::modeWrite))
		{
			MessageBox(L"文件路径或文件名不正确或没有写入权限");
			return;
		}
		file.Close();




		CImage image;
		image.Attach(bmp);		//加锁
		if (!image.IsNull())
		{
			image.Save(strFilename);				//保存文件中
			image.Detach();								//解锁
		}
		else
		{
			MessageBox(L"操，又tm保存不了");
		}

		//把bmp存到剪切板中：
		OpenClipboard();
		EmptyClipboard();
		SetClipboardData(CF_BITMAP, bmp);
		CloseClipboard();

		//关闭对话框：

		EndDialog(IDCANCEL);


	}


	CDialogEx::OnLButtonDblClk(nFlags, point);
}

////鼠标点住移动窗口位置
//LRESULT CSHOWDlg::OnNcHitTest(CPoint point)
//{
//	// TODO: 在此添加消息处理程序代码和/或调用默认值
//
//	LRESULT result = CDialogEx::OnNcHitTest(point);
//
//	if (HTCLIENT == result)
//	{
//		result = HTCAPTION;
//	}
//
//	return result;
//}


//右击取消，结束所截取到的窗口
void CSHOWDlg::OnRButtonDown(UINT nFlags, CPoint point)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值

	EndDialog(IDCANCEL);
	CDialogEx::OnRButtonDown(nFlags, point);
}
